package disenioPantallas.AltaAnimal;

import gestores.GestorAnimal;
import gestores.GestorCampo;
import gestores.GestorErrores;
import gestores.GestorSistema;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JLabel;

import disenioPantallas.elementos.EButton;
import disenioPantallas.elementos.FrameAutenticado;
import disenioPantallas.elementos.MyTableModel;
import disenioPantallas.elementos.dialogGeneral;
import entidades.Animal;
import entidades.Campo;
import entidades.Categoria;
import entidades.Raza;


public class DBuscarPariente extends dialogGeneral {

	private GestorAnimal gAnimal=GestorAnimal.getGestorAnimal();
	private GestorSistema gSistema=GestorSistema.getGestorSistema();
	private JTable tableResultados;
	private JTable tableFiltrar;
	private String sexo;
	private String especie;
	private Vector<Animal> animales=new Vector<Animal>();
	private int idAnimalSeleccionado;
	
	
	private Vector<String> nombreRazas=new Vector<String>();
    private Vector<String> nombreCategorias=new Vector<String>();
    private Vector<String> nombreCampos=new Vector<String>();
    private Vector<String> nombrePotreros=new Vector<String>();
    private Vector<Campo> camposEncontrados=new Vector<Campo>();
    private Vector<Categoria> categoriasEncontradas=new Vector<Categoria>();
    private Vector<Raza> razasEncontradas=new Vector<Raza>();

	private GestorCampo gCampo=GestorCampo.getGestorCampo();

	
	public DBuscarPariente() {
		setMinimumSize(new Dimension(850, 600));
		
		JPanel panelTitulo = new JPanel();
		panelTitulo.setOpaque(false);
		
		Component verticalStrut = Box.createVerticalStrut(35);
		getContentPane().add(verticalStrut);

		
		getContentPane().add(panelTitulo, BorderLayout.NORTH);
		panelTitulo.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JLabel lblSeleccioneElAnimal = new JLabel("Seleccione el Animal");
		panelTitulo.add(lblSeleccioneElAnimal);
		lblSeleccioneElAnimal.setFont(new Font("Cambria", Font.PLAIN, 24));

			
		JPanel panelListar = new JPanel();
		getContentPane().add(panelListar);
		panelListar.setOpaque(false);
		panelListar.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JPanel panelListado = new JPanel();
		panelListado.setOpaque(false);
		panelListar.add(panelListado);
		panelListado.setLayout(new BoxLayout(panelListado, BoxLayout.Y_AXIS));
		
		
        JPanel panelFiltrar = new JPanel();
        panelFiltrar.setOpaque(false);
        panelListado.add(panelFiltrar);
        panelFiltrar.setLayout(new BoxLayout(panelFiltrar, BoxLayout.X_AXIS));
        
        tableFiltrar= new JTable();
        tableFiltrar.setModel(new filtrarTableModel());
        tableFiltrar.setFillsViewportHeight(true);
        tableFiltrar.setFont(new Font("Cambria", Font.PLAIN, 14));
        tableFiltrar.getModel().addTableModelListener(new tableFiltroActionListener());

        
		JScrollPane scrollPaneFiltrar = new JScrollPane(tableFiltrar);
		scrollPaneFiltrar.setMinimumSize(new Dimension(600, 80));
		scrollPaneFiltrar.setBorder(new TitledBorder(null, "Filtro", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelFiltrar.add(scrollPaneFiltrar);
		scrollPaneFiltrar.setMaximumSize(new Dimension(600, 80));
		scrollPaneFiltrar.setPreferredSize(new Dimension(600, 80));
		
		Component horizontalStrut = Box.createHorizontalStrut(20);
		panelFiltrar.add(horizontalStrut);
		
		EButton btnBuscar = new EButton("BUSCAR");
		panelFiltrar.add(btnBuscar);
		btnBuscar.addActionListener(new buscarAction());
		
		Component horizontalGlue = Box.createHorizontalGlue();
		panelFiltrar.add(horizontalGlue);
		
			
		JPanel panelResultados = new JPanel();
		panelResultados.setOpaque(false);
		panelListado.add(panelResultados);
		panelResultados.setLayout(new BoxLayout(panelResultados, BoxLayout.X_AXIS));
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setMinimumSize(new Dimension(800, 25));
		scrollPane.setMaximumSize(new Dimension(800, 400));
		scrollPane.setBorder(new TitledBorder(null, "Resultados", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelResultados.add(scrollPane);
		scrollPane.setPreferredSize(new Dimension(800, 400));
		
		tableResultados = new JTable();
		tableResultados.setFont(new Font("Cambria", Font.PLAIN, 14));
		tableResultados.setModel(new listadoTableModel(animales));
		tableResultados.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		scrollPane.setViewportView(tableResultados);
		tableResultados.setRowSelectionAllowed(true);
		tableResultados.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		
		JPanel panelSeleccionar = new JPanel();
		panelSeleccionar.setOpaque(false);
		getContentPane().add(panelSeleccionar, BorderLayout.SOUTH);
		panelSeleccionar.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JButton btnSeleccionar = new EButton("Seleccionar");
		panelSeleccionar.add(btnSeleccionar);
		btnSeleccionar.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				if(tableResultados.getSelectedRowCount()==1){
					setIdAnimalSeleccionado(animales.get(tableResultados.getSelectedRow()).getIdAnimal());
					dispose();
				}else{
					GestorErrores.getGestorErrores().mostrarCartelError("Seleccione un Animal");
				}
				
			}
		});
		
		JButton btnNinguno = new EButton("Ninguno");
		panelSeleccionar.add(btnNinguno);
		btnNinguno.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				setIdAnimalSeleccionado(0);
				dispose();
			}
		});
		
		JButton btnCancelar = new EButton("Cancelar");
		panelSeleccionar.add(btnCancelar);
		btnCancelar.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {	cerrarDialog();}});
		
			

	
			
			
		
	}
	
	public String getEspecie() {
		return especie;
	}
	public void setEspecie(String especie) {
		this.especie = especie;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public int getIdAnimalSeleccionado() {
		return idAnimalSeleccionado;
	}

	public void setIdAnimalSeleccionado(int idAnimalSeleccionado) {
		this.idAnimalSeleccionado = idAnimalSeleccionado;
	}

	private class filtrarTableModel extends MyTableModel{
		private static final long serialVersionUID = 1L;
		
		public filtrarTableModel(){
			super();
	        Object[][] dataTable={{"","","","",""}};
			setInfo(dataTable);
			String[] columnas={"RAZA", "CATEGORIA", "CAMPO","POTRERO"};
			setColumnNames(columnas);
			
			boolean[] edits= {true,true,true,true};
			setEdits(edits);
			
			
			
		}
		
	}

	private class buscarAction extends AbstractAction{

		private static final long serialVersionUID = 1L;
		private String especie,raza,categoria,sexo,campo,potrero;
		
		public void actionPerformed(ActionEvent arg0) {
			try {
				especie=getEspecie();
				raza=(String) tableFiltrar.getValueAt(0, 0).toString();
				sexo=getSexo();
				categoria=(String) tableFiltrar.getValueAt(0,1).toString();
				campo=(String) tableFiltrar.getValueAt(0,2).toString();
				potrero=(String) tableFiltrar.getValueAt(0,3).toString();
				animales=gAnimal.getListadeAnimales(especie,raza,sexo,categoria,campo,potrero);
				tableResultados.setModel(new listadoTableModel(animales));
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				GestorErrores.getGestorErrores().mostrarCartelError(e.getMessage());
				e.printStackTrace();
			}
			
		}
		
		
	}
	private class listadoTableModel extends MyTableModel{
		private static final long serialVersionUID = 1L;
		
		public listadoTableModel(Vector<Animal> animalesEncontrados){
			super();
			
			String[] columnas={"ID","CARAVANA","RAZA", "CATEGORIA", "CAMPO","POTRERO"};
			setColumnNames(columnas);
			Object[][] info= new Object[0][6];
			setColumnNames(columnas);
			
			if(animalesEncontrados.size()>0){
				info= new Object[animalesEncontrados.size()][6];
				for(int i=0;i<animalesEncontrados.size();i++){
					info[i][0]=animalesEncontrados.get(i).getIdAnimal();
					info[i][1]=animalesEncontrados.get(i).getCaravanaActual().getCaravana();
					info[i][2]=animalesEncontrados.get(i).getRaza().getRaza();
					info[i][3]=animalesEncontrados.get(i).getCategoria().getCategoria();
					info[i][4]=animalesEncontrados.get(i).getPotreroActual().getCampoPerteneciente().getNombreCampo();
					info[i][5]=animalesEncontrados.get(i).getPotreroActual().getNombrePotrero();
				}
			}
			setInfo(info);
			boolean[] edits= {false,false,false,false,false,false};
			setEdits(edits);
			
			
			
		}
		
	


	}
	
    public void comboBoxColumn(JTable table, TableColumn column, Vector<String> v) {
    	//Set up the editor for the sport cells.
    	JComboBox<String> comboBox = new JComboBox<String>(v);
    	comboBox.setSelectedIndex(0);
    	column.setCellEditor(new DefaultCellEditor(comboBox));
    	
    	//Set up tool tips for the sport cells.
		DefaultTableCellRenderer renderer =new DefaultTableCellRenderer();
		renderer.setToolTipText("Seleccionar");
		column.setCellRenderer(renderer);
    }

	
    public void cargarCampos(){
		try {
			camposEncontrados= gCampo.getCamposEncontrados();
			categoriasEncontradas= gSistema.getCategoriasEncontradas();
			razasEncontradas= gSistema.getRazasEncontradas();
			

			nombreCampos.add("");
			for(int i=0;i<camposEncontrados.size();i++){
				nombreCampos.add(camposEncontrados.get(i).getNombreCampo());
			}
			
			if(camposEncontrados.size()>0){
				Campo c=camposEncontrados.get(0);
			
				nombrePotreros= new Vector<String>();
				nombrePotreros.add("");
				for(int i=0;i<c.getPotreros().size();i++){
					nombrePotreros.add(c.getPotreros().get(i).getNombrePotrero());
					
					}
				}
			nombreRazas.add("");
			for(int i=0;i<razasEncontradas.size();i++){
				if(razasEncontradas.get(i).getEspecie().equals(getEspecie()))
					nombreRazas.add(razasEncontradas.get(i).getRaza());
			}
			

			
			nombreCategorias= new Vector<String>();
			nombreCategorias.add("");
			for(int i=0;i<categoriasEncontradas.size();i++){
				if(categoriasEncontradas.get(i).getSexo().equals(getSexo()) && categoriasEncontradas.get(i).getEspecie().equals(getEspecie()))
					nombreCategorias.add(categoriasEncontradas.get(i).getCategoria());
				}

		       comboBoxColumn(tableFiltrar, tableFiltrar.getColumnModel().getColumn(0),nombreRazas);
		       comboBoxColumn(tableFiltrar, tableFiltrar.getColumnModel().getColumn(1),nombreCategorias);
		       comboBoxColumn(tableFiltrar, tableFiltrar.getColumnModel().getColumn(2),nombreCampos);
		       comboBoxColumn(tableFiltrar, tableFiltrar.getColumnModel().getColumn(3),nombrePotreros);

	
			
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			GestorErrores.getGestorErrores().mostrarCartelError(e.getMessage());
			e.printStackTrace();
		}

    }

    
	private class tableFiltroActionListener implements TableModelListener{

		@Override
		public void tableChanged(TableModelEvent e) {
			int columna=e.getColumn();
			
			switch (columna) {

			case 4:{
				
			
				String campo=(String) tableFiltrar.getValueAt(0, 2);
				Campo c=null;
				 
				for(int i=0;i<camposEncontrados.size();i++){
					if(camposEncontrados.get(i).getNombreCampo().equals(campo))
						c=camposEncontrados.get(i);
				}
				
				nombrePotreros= new Vector<String>();
				nombrePotreros.add("");
				if(c!=null){
					for(int i=0;i<c.getPotreros().size();i++){
						nombrePotreros.add(c.getPotreros().get(i).getNombrePotrero());
						
						}
					comboBoxColumn(tableFiltrar, tableFiltrar.getColumnModel().getColumn(3), nombrePotreros);
				}
				tableFiltrar.setValueAt("", 0, 3);
			
				
				
				break;
			}
				
			default:
				break;
			}
		}
		
		
	}



}
